package cn.itsource.interceptor;

import cn.itsource.annotation.CheckPer;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>拦截器：校验所有请求是否有权限访问目标方法</p>
 *
 * @author 波波老师(微信 ： javabobo0513)
 * @date 2022/11/18-15:24
 */
@Component
public class CheckPermission implements HandlerInterceptor {

    //在执行目标方法之前执行
    @Override
    public boolean preHandle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler) throws Exception {

        System.out.println("进入权限校验拦截器了......");
        //handler 可以理解为请求对象
        if (!(handler instanceof HandlerMethod)) {
            //说明拦截到的请求，不是请求方法的，那就直接放行
            return true;//放行
        }
        //指定到这里，说明请求的是方法
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        //获取目标方法对象
        Method method = handlerMethod.getMethod();

        //获取目标方法上面的注解
        CheckPer annotation = method.getAnnotation(CheckPer.class);
        if(annotation == null){
            System.out.println("直接放行了......");
            return true;//放行
        }
        //说明目标方法上面一定打了 CheckPer 注解，那就需要做权限校验
        String per = annotation.per();//获取方法上面的权限字符串

        String token = request.getHeader("token");
        //List<String> list =  redis.get(token);
        List<String> list =  new ArrayList<>();//测试代码
        list.add("user:add");
        list.add("user:delete");
        list.add("user:update");
        if(!list.contains(per)){
            //没有权限访问接口
            System.out.println("没有权限访问接口");
            return false;//不放行，打回
        }
        System.out.println("有权限访问目标接口");
        return true;
    }
}